package com.zmn.plat.business.interfaces.product.tariff;

import com.zmn.plat.common.dto.brand.BaseBrandPageDRO;
import com.zmn.plat.common.dto.product.tariff.TariffBackProductDRO;
import com.zmn.plat.common.dto.product.tariff.TariffProductDIO;
import com.zmn.plat.common.dto.product.tariff.TariffProductPageDRO;
import com.zmn.plat.common.dto.product.tariff.brand.TariffBrandFactorDIO;
import com.zmn.plat.common.dto.product.tariff.category.*;
import com.zmn.plat.common.dto.product.tariff.item.*;
import com.zmn.plat.common.dto.product.tariff.servcategory.TariffServCategoryDRO;
import com.zmn.plat.common.dto.servcategory.ServCategoryChildrenDRO;
import com.zmn.plat.model.dto.product.ProductTariffRelationDTO;
import com.zmn.plat.model.dto.product.tariff.TariffProductRedisDTO;
import com.zmn.plat.model.dto.service.ItemPriceCalDTO;
import com.zmn.plat.model.entity.servcategory.ShowCategoryAssociationVO;
import com.zmn.plat.model.vo.brand.factor.BrandFactorRatioVo;
import com.zmn.plat.model.vo.product.tariff.TariffProductItemPriceTariffVO;
import com.zmn.plat.model.vo.product.tariff.item.price.ProductServiceItemExcutePriceQueryVo;
import com.zmn.plat.model.vo.product.tariff.item.price.ProductServiceItemExcutePriceResultVo;

import java.util.List;

/**
 * @author tanbiao
 * @description
 * @modifier
 * @since 2020/3/25 14:35
 **/
public interface TariffProductBService {
    /**
     * 描述: 根据计价器二级分类ID查询关联的服务分类列表 必须参数
     * 1. 试点标志：filterTariff
     * 2. 计价器产品二级分类Id：showCategId
     * 3. 城市Id：cityId
     * 4. 渠道Id：channelId
     * 可选参数
     * 1. 业务类型：bizType
     * 默认保外
     *
     * @param dio
     * @return List<TariffServCategoryDRO> 前后台关联关系，以及其分类名称实体集合
     * @auther tanbiao
     */
    List<TariffServCategoryDRO> listServCategoryByChannelIdAndCityIdAndTariffCategoryId(TariffCategoryRelationDIO dio);

    /**
     * 获取计价器产品
     * 必须参数
     * 1. 计价器产品服务分类Id：servCategId
     * 2. 计价器产品二级分类Id：categId
     * 3. 城市Id：cityId
     * 4. 渠道Id：channelId
     * 可选参数
     * 1. 保内保外：keepType 默认保外
     * 2. 页码：pageNum 默认第一页
     * 3. 每页条数：pageSize 默认50
     *
     * @param tariffProductDIO
     * @return
     * @author tanbiao
     */
    TariffProductPageDRO listPageByTariffProductDIO(TariffProductDIO tariffProductDIO);

    /**
     * 查询项目列表,三四五步都是这个接口
     * 必须参数
     * 1. 计价器产品Id：tariffProductId
     * 2. 故障类型Id：categId
     * 3. 渠道Id：channelId
     * 4. 城市：cityId
     * 可选参数
     * 1. 保内保外：keepType 默认保外
     * 2.所选项目id集合：itemIds，
     * 第一步不需要，后面步骤需要根据所选的集合层层筛选满足要求的后台产品 （存在同一个计价器产品不同的后台产品会有不同的项目导致后续步骤报价有问题）
     *
     * @param tariffProductItemCategDIO
     * @return
     * @author tanbiao
     */
    List<TariffProductItemDRO> listByTariffProductItemCategDIO(TariffProductItemCategDIO tariffProductItemCategDIO);

    /**
     * 计价器产品对应的所有后台产品的二级分类列表 必须参数 1. 计价器产品Id：tariffProductId 2. 城市Id：cityId 3. 渠道Id：channelId 4.
     * 所选项目id集合：itemIds，第一步不需要，后面步骤需要根据所选的集合层层筛选满足要求的后台产品 （存在同一个计价器产品不同的后台产品会有不同的项目导致后续步骤报价有问题） 可选参数 1. 保内保外：keepType 默认保外
     *
     * @param tariffCategoryDIO
     * @return
     */
    List<TariffCategoryDRO> listByTariffCategoryDIO(TariffCategoryDIO tariffCategoryDIO);

    /**
     * 描述: 后台产品二级分类下的后台产品(计价器专用) 必须参数 1. 后台服务分类Id：servCategId 2. 城市Id：cityId 3. 渠道Id：channelId 4. 产品二级分类id：categId 5.
     * 所选项目id集合：itemIds，第一步不需要，后面步骤需要根据所选的集合层层筛选满足要求的后台产品 （存在同一个计价器产品不同的后台产品会有不同的项目导致后续步骤报价有问题） 6. 计价器产品id:tariffProductId 可选参数 1. 保内保外：keepType
     * 默认保外
     *
     * @param productFaultDIO
     * @return 产品集合
     * @auther tanbiao
     * @since 2019/11/21 11:29
     */
    List<TariffBackProductDRO> listProductByProductFaultCategDIO(TariffProductCategoryDIO productFaultDIO);

    /**
     * 根据产品二级分类查询品牌 必须参数 1. 计价器产品服务分类Id：servCategId 2. 计价器产品一级分类Id：categOneId 3. 计价器产品二级分类Id：categId 可选参数 1. 页码：pageNum 默认第一页 2. 每页条数：pageSize
     * 默认50
     *
     * @param faultTariffBrandRatioDIO
     * @return BaseBrandDRO实体对象
     */
    BaseBrandPageDRO listPageBrandByBrandFactorDIO(TariffBrandFactorDIO faultTariffBrandRatioDIO);

    /**
     * 根据渠道城市保内保外，服务分类和二级分类查询品牌数据，用于品牌存在的情况下，参与数据的筛选 必须参数 1. 渠道Id：channelId 2. 城市id：cityId 3. 保内保外：keepType 4. 服务分类id：servCategId 5.
     * 二级分类id：categId 6. 产品类型：showType
     *
     * @return ResponseDTO<List < BrandFactorRatioVo>>
     */
    List<BrandFactorRatioVo> listConfigedBrandByRedisDTO(TariffProductRedisDTO redisDTO);

    /**
     * 获取前台产品的二级分类,支持首字模糊匹配，支持分页，每页有多少条，由APP传入的参数决定 必须参数 1. 二级分类名称关键字：name 2. 二级分类级别：level 3. 产品类型：showType，计价器必须为2 4. 是否计价器渠道：isTariffChannel
     * 5. 渠道id：channelId,isTariffChannel为null/false,必传，需要根据参数去过滤渠道试点数据 6. 城市id：cityId,isTariffChannel为null/false,必传，需要根据参数去过滤渠道试点数据 可选参数 1.
     * 页码：pageNum 默认第一页 2. 每页条数：pageSize 默认50
     *
     * @param tariffCategoryPageDIO 统一入参
     * @return
     */
    TariffCategoryPageDRO listCategoryPageByCategoryDIO(TariffCategoryPageDIO tariffCategoryPageDIO);

    /**
     * 功能描述 :指定渠道前台二级分类对应的支持计价器试点的数据
     *
     * @param showCategId
     * @param channelId
     * @param cityId
     * @param bizType
     * @return java.util.List<com.zmn.plat.model.entity.category.BaseCategory>
     * @author tanbiao
     * @modifier
     * @since 2020/4/10
     */
    List<ShowCategoryAssociationVO> listAviableShowCategoryAssociation(Integer channelId, Integer cityId, Integer showCategId, Integer filterTariff, Integer bizType);

    /**
     * 描述: 根据所选择项目，提交报价接口 必须参数 1. 后台产品id：productId 2. 城市Id：cityId 3. 渠道Id：channelId 4. 所选项目id集合：itemIds，第一步不需要，后面步骤需要根据所选的集合层层筛选满足要求的后台产品
     * （存在同一个计价器产品不同的后台产品会有不同的项目导致后续步骤报价有问题） 5. 计价器产品id：tariffProductId 可选参数 1. 保内保外：keepType 默认保外 2. 品牌 brandId,不传递不参与计算
     *
     * @param query
     * @return 产品集合
     * @auther tanbiao
     * @since 2019/11/21 11:29
     */
    List<TariffProductItemPriceDRO> listItemPriceByProductIdAndItemIds(TariffProductItemPriceDIO query);

    /**
     * 描述: 后台二级分类不清楚 必须参数 1. 服务分类id：servCategId 2. 城市Id：cityId 3. 渠道Id：channelId 4. 所选项目id集合：itemIds， 5. 计价器产品id：tariffProductId
     * <p>
     * 可选参数 1. 保内保外：keepType 默认保外 2. 品牌 brandId,不传递不参与计算
     *
     * @param categoryDIO
     * @return 产品集合
     * @auther tanbiao
     * @since 2019/11/21 11:29
     */
    List<TariffProductItemPriceUnknownDRO> listProductPriceByTariffProductId(TariffProductItemUnknowCategoryDIO categoryDIO);

    /**
     * 描述: 后台产品不清楚（确定了后台二级分类之后的报价） 必须参数 1. 城市Id：cityId 2. 渠道Id：channelId 3. 所选项目id集合：itemIds， 4. 计价器产品id：tariffProductId 5. 后台产品二级分类：categId
     * 可选参数 1. 保内保外：keepType 默认保外 2. 品牌 brandId,不传递不参与计算
     *
     * @param categoryDIO
     * @return 产品集合
     * @auther tanbiao
     * @since 2019/11/21 11:29
     */
    List<TariffProductItemPriceUnknownDRO> listProductPriceByCategId(TariffProductItemUnknowProductDIO categoryDIO);

    /**
     * 通过城市ID，渠道ID，后台产品ID，查一口价故障服务项 必须参数 1. 产品id：productId 2. 城市Id：cityId 3. 渠道Id：channelId 可选参数 1. 保内保外：keepType 默认保外 2. 品牌 brandId,不传递不参与计算
     *
     * @param faultItemPriceDIO
     * @return 产品集合
     * @auther tanbiao
     * @since 2019/11/21 11:29
     */
    List<TariffProductItemPriceDRO> listByProductItemPriceSplitItemDIO(TariffProductItemPriceSplitItemDIO faultItemPriceDIO);

    /**
     * 通过城市ID，渠道ID，后台产品ID，查非一口价故障服务项（默认故障服务项） 必须参数 1. 产品id：productId 2. 城市Id：cityId 3. 渠道Id：channelId 可选参数 1. 保内保外：keepType 默认保外 2. 品牌
     * brandId,不传递不参与计算
     *
     * @param faultItemPriceDIO
     * @return 产品集合
     * @auther tanbiao
     * @since 2019/11/21 11:29
     */
    List<TariffProductItemPriceDRO> listByProductItemDefaultDIO(TariffProductItemDefaultDIO faultItemPriceDIO);

    /**
     * 执行价页面使用，无缓存
     *
     * @param query
     * @return
     */
    List<ProductServiceItemExcutePriceResultVo> listByExcuteQuery(ProductServiceItemExcutePriceQueryVo query);

    /**
     * 接口调用，添加缓存
     *
     * @param query
     * @return
     */
    List<ProductServiceItemExcutePriceResultVo> listByExcuteQueryCached(ProductServiceItemExcutePriceQueryVo query);

    /**
     * 功能描述 :渠道城市下指定的服务分类和后台二级分类的配置有价格表的所有后台数据 支持查询前后台产品分类下的数据，前后台分类通过showType区分（有缓存一小时，没有计算价格）
     * <p>
     * channelId 渠道id cityId 城市id keepType 保内保保外 servCategId 前/后台服务分类 categId 前/后台产品二级分类 showType 产品类型 1 后台 2 前台
     *
     * @return java.util.List<TariffProductItemPriceTariffVO>
     * @author tanbiao
     * @modifier
     * @since 2020/3/26
     */
    List<TariffProductItemPriceTariffVO> listRelatedTariffProductByRedisDTO(TariffProductRedisDTO redisDTO);

    /**
     * 描述: 根据后台产品id和故障类型查询故障列表,报价完毕添加增值服务和其他服务等 必须参数 1. 计价器产品Id：tariffProductId 1. 后台产品Id：productId 2. 故障类型Id：faultCategId 3. 渠道Id：channelId 4.
     * 城市：cityId 可选参数 1. 保内保外：keepType 默认保外 2. 品牌id：brandId
     *
     * @param productItemDIO
     * @return
     */
    List<TariffProductItemPriceDRO> listByTariffBackProductItemCategDIO(TariffBackProductItemCategDIO productItemDIO);

    /**
     * 描述: 根据后台产品id 价格表id查询默认的一口价服务项目
     *
     * @param list
     * @return
     */
    List<ProductServiceItemExcutePriceResultVo> listDefaultItemPriceByRelationDTOList(List<ProductTariffRelationDTO> list, ItemPriceCalDTO dto,Integer showType);

    /**
     * 描述: 获取有计价器产品的服务品类
     *
     * @param channelId 渠道id
     * @param cityId 城市id
     * @return
     * @author guoqiao
     * @since 2021/8/4 13:53
     */
    List<ServCategoryChildrenDRO> listServAndCategByChannelIdAndCity(Integer channelId, Integer cityId);

    /**
     * 描述: 获取有计价器产品的二级分类
     *
     * @param channelId 渠道id
     * @param cityId 城市id
     * @return
     * @author guoqiao
     * @since 2021/8/4 13:53
     */
    TariffCategoryPageDRO listTwoCategByChannelIdAndCity(Integer channelId, Integer cityId);
}
